package com.chenyun.sys.controller;


import com.chenyun.sys.common.ActiverUser;
import com.chenyun.sys.common.ResultObj;
import com.chenyun.sys.common.WebUtils;
import com.chenyun.sys.domain.Loginfo;
import com.chenyun.sys.service.impl.LoginfoServiceImpl;
import com.wf.captcha.utils.CaptchaUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 登录
 */

@RestController
public class LoginController {

    @Autowired
    private LoginfoServiceImpl loginfoService;

    @RequestMapping("/login")
    public ResultObj login(String loginname, String pwd,@RequestParam("captcha") String verCode){
        // 1.根据用户名和密码创建Token
        UsernamePasswordToken token = new UsernamePasswordToken(loginname, pwd);

        // 2.获取subject主体
        Subject subject = SecurityUtils.getSubject();

        if (!CaptchaUtil.ver(verCode, WebUtils.getRequest())) {
            CaptchaUtil.clear(WebUtils.getRequest());  // 清除session中的验证码
            return ResultObj.LOGIN_ERROR_PASS;
        }
        try {
            // 3.开始认证，这一步会跳到我们自定义的 UserRealm 中
            subject.login(token);

            // 登录成功后获取身份 这里就是UserRealm类里面SimpleAuthenticationInfo传过来的activerUser
            ActiverUser activerUser=(ActiverUser) subject.getPrincipal();
            WebUtils.getSession().setAttribute("user",activerUser.getUser());


            // 记录登录日志
            Loginfo loginfo = new Loginfo();
            loginfo.setLoginname(activerUser.getUser().getName()+"-"+activerUser.getUser().getLoginname());
            loginfo.setLoginip(WebUtils.getRequest().getRemoteAddr());      // 封装IP地址
            loginfo.setLogintime(new Date());
            loginfoService.save(loginfo);

            return ResultObj.LOGIN_SUCCESS;   // 登录成功返回自定义消息

        } catch (AuthenticationException e) {
            e.printStackTrace();
            return ResultObj.LOGIN_ERROR_PASS;  // 登录失败返回自定义消息
        }
    }

}
